I was playing around with making MIDAS clients. I found out you can't create multiple clients in on C++ program. It leads to race conditions within MIDAS. I wish I knew that before spending 4 hours creating a library to launch mutliple clients.
receiver_lib_test: /home/pioneer/packages/midas/src/system.cxx:2976: INT ss_mutex_create(MUTEX_T**, BOOL): Assertion `status == 0' failed.
receiver_lib_test: /home/pioneer/packages/midas/src/system.cxx:2976: INT ss_mutex_create(MUTEX_T**, BOOL): Assertion `status == 0' failed.
Here is the github of the branch of my "midas_receiver" that fails:
On the bright side, I still have my working branch that just launches one client. That branch is available here
Just a note that at low rates, I was able to run the g-2 modified DAQ for 20 hours without erroring out. Providing evidence that CCC: Run abort
s are indeed caused by higher rate applications somehow. by
This is in $MIDASSYS/midasio/midasio.h
for reference:
class TMEvent { public: // event data bool error; ///< event has an error - incomplete, truncated, inconsistent or corrupted uint16_t event_id; ///< MIDAS event ID uint16_t trigger_mask; ///< MIDAS trigger mask uint32_t serial_number; ///< MIDAS event serial number uint32_t time_stamp; ///< MIDAS event time stamp (unix time in sec) uint32_t data_size; ///< MIDAS event data size size_t event_header_size; ///< size of MIDAS event header uint32_t bank_header_flags; ///< flags from the MIDAS event bank header std::vector<TMBank> banks; ///< list of MIDAS banks, fill using FindAllBanks() std::vector<char> data; ///< MIDAS event bytes public: // internal data bool found_all_banks; ///< all the banks in the event data have been discovered size_t bank_scan_position; ///< location where scan for MIDAS banks was last stopped public: // constructors TMEvent(); // ctor TMEvent(const void* buf, size_t buf_size); // ctor void Reset(); ///< reset everything void ParseEvent(); ///< parse event data void ParseHeader(const void* buf, size_t buf_size); ///< parse event header void Init(uint16_t event_id, uint16_t trigger_mask = 0, uint32_t serial_number = 0, uint32_t time_stamp = 0, size_t capacity = 0); public: // read data void FindAllBanks(); ///< scan the MIDAS event, find all data banks TMBank* FindBank(const char* bank_name); ///< scan the MIDAS event char* GetEventData(); ///< get pointer to MIDAS event data const char* GetEventData() const; ///< get pointer to MIDAS event data char* GetBankData(const TMBank*); ///< get pointer to MIDAS data bank const char* GetBankData(const TMBank*) const; ///< get pointer to MIDAS data bank public: // add data void AddBank(const char* bank_name, int tid, const char* buf, size_t size); ///< add new MIDAS bank public: // bank manipulation //void DeleteBank(const TMBank*); ///< delete MIDAS bank public: // information methods std::string HeaderToString() const; ///< print the MIDAS event header std::string BankListToString() const; ///< print the list of MIDAS banks std::string BankToString(const TMBank*) const; ///< print definition of one MIDAS bank void PrintHeader() const; void PrintBanks(int level = 0); void DumpHeader() const; };
class TMEvent
{
public: // event data
bool error; ///< event has an error - incomplete, truncated, inconsistent or corrupted
uint16_t event_id; ///< MIDAS event ID
uint16_t trigger_mask; ///< MIDAS trigger mask
uint32_t serial_number; ///< MIDAS event serial number
uint32_t time_stamp; ///< MIDAS event time stamp (unix time in sec)
uint32_t data_size; ///< MIDAS event data size
size_t event_header_size; ///< size of MIDAS event header
uint32_t bank_header_flags; ///< flags from the MIDAS event bank header
std::vector<TMBank> banks; ///< list of MIDAS banks, fill using FindAllBanks()
std::vector<char> data; ///< MIDAS event bytes
public: // internal data
bool found_all_banks; ///< all the banks in the event data have been discovered
size_t bank_scan_position; ///< location where scan for MIDAS banks was last stopped
public: // constructors
TMEvent(); // ctor
TMEvent(const void* buf, size_t buf_size); // ctor
void Reset(); ///< reset everything
void ParseEvent(); ///< parse event data
void ParseHeader(const void* buf, size_t buf_size); ///< parse event header
void Init(uint16_t event_id, uint16_t trigger_mask = 0, uint32_t serial_number = 0, uint32_t time_stamp = 0, size_t capacity = 0);
public: // read data
void FindAllBanks(); ///< scan the MIDAS event, find all data banks
TMBank* FindBank(const char* bank_name); ///< scan the MIDAS event
char* GetEventData(); ///< get pointer to MIDAS event data
const char* GetEventData() const; ///< get pointer to MIDAS event data
char* GetBankData(const TMBank*); ///< get pointer to MIDAS data bank
const char* GetBankData(const TMBank*) const; ///< get pointer to MIDAS data bank
public: // add data
void AddBank(const char* bank_name, int tid, const char* buf, size_t size); ///< add new MIDAS bank
public: // bank manipulation
//void DeleteBank(const TMBank*); ///< delete MIDAS bank
public: // information methods
std::string HeaderToString() const; ///< print the MIDAS event header
std::string BankListToString() const; ///< print the list of MIDAS banks
std::string BankToString(const TMBank*) const; ///< print definition of one MIDAS bank
void PrintHeader() const;
void PrintBanks(int level = 0);
void DumpHeader() const;
};
This is just a class for handling event data, useful reference.